#STEP 1: Choose the variables
We aim to investigate whether COVID-19 severity influences COL11A2
expression, whether patient sex affects COL11A2 expression and whether
there is an interaction between sex and disease severity in determining
COL11A2 levels. We investigate three questions (H0 = null hypothesis and
H1= alternative hypothesis):
H0a: The mean standardized COL11A2 expression is equal across all
COVID-19 severity groups. H1a: At least one COVID-19 severity group has
a different mean standardized COL11A2 expression.
H0b: The mean standardized COL11A2 expression is equal between male
and female patients. H1b: The mean standardized COL11A2 expression
differs between male and female patients.
H0c: There is no interaction between sex and COVID-19 severity on
mean standardized COL11A2 expression. H1c: The effect of COVID-19
severity on mean standardized COL11A2 expression differs between males
and females.
Why COL11A2? This protein was selected because it was mentioned in
the reference article. COL11A2 is a collagen component involved in two
pathways that were found to be downregulated in severe COVID-19:
Integrin cell surface interactions and Collagen biosynthesis and
modifying enzymes. Since these pathways include multiple collagen
proteins, COL11A2 is a biologically meaningful candidate for
investigating severity-associated differences.
#install.packages("ggpubr")
library(ggplot2)
library(dplyr)
library(ggpubr)
library(tidyverse)
#STEP 2: Make the dataset To test our hypotheses, we need a dataset
that contains both the clinical variables (sex and WHO_temp_severity)
and the standardized, log-transformed expression values of the protein
of interest (COL11A2). These variables originate from different sections
of the full dataset, so a new dataframe must be constructed.
During the earlier data-exploration phase, we verified that there
were no missing values in sex, WHO_temp_severity or the COL11A2 protein
measurements. Therefore, no additional imputation or row removal is
required in this preprocessing step.
We proceed by importing the full dataset, extracting the protein
expression matrix, applying a log-transformation followed by
standardization (z-scaling), and combining it with the relevant clinical
features into a single analysis-ready dataframe.
# Import whole dataset
combined_dataset <- read.csv("combined_dataset.csv")
# Split dataset in subsets
combined_dataset_protein <-combined_dataset[,1:7241]
proteins_log <- log(combined_dataset_protein[,2:7241])
proteins_scaled <- as.data.frame(scale(proteins_log))
feature_df <-combined_dataset[,7242:7258]
data_multivariate <- data.frame( COL11A2 = proteins_scaled$COL11A2, severity = feature_df$WHO_temp_severity, sex = feature_df$sex)
data_multivariate$severity <- factor(data_multivariate$severity, levels = c("NEGATIVE", "mild", "moderate", "severe", "critical"))
#STEP 3: Check for outliers To identify potential extreme values, we
will calculate the interquartile range (IQR) of COL11A2 and determine
which observations fall outside the 1.5×IQR boundaries, as these will be
considered statistical outliers.
protein <- combined_dataset$COL11A2
Q1 <- quantile(protein, 0.25, na.rm = TRUE)
Q3 <- quantile(protein, 0.75, na.rm = TRUE)
IQR_value <- IQR(protein, na.rm = TRUE)
lower_bound <- Q1 - 1.5 * IQR_value
upper_bound <- Q3 + 1.5 * IQR_value
outliers <- protein[protein < lower_bound | protein > upper_bound]
outliers
[1] 14059.1 11043.5 8828.0 8977.9 10079.4 9938.0 10522.9 8040.3 9685.6 11337.0 8650.3 11166.6 11076.8 12590.7 9094.0 11050.3 8299.4
[18] 10443.6 14506.3 13175.1 9877.9 13243.2 13882.3
ggplot(data_multivariate, aes(x = severity, y = COL11A2, fill= severity)) +
geom_boxplot(outliers = FALSE) +
geom_jitter (width =0.15, alpha =0.4, color = "black") +
scale_fill_brewer(palette = "Set2") +
theme_minimal()+
labs(title = "COL11A2 levels across the different severity groups")

INTERPRETATION: Although several outliers are present (as seen in
boxplot), there is no evidence of measurement or data-entry error and
the values appear biologically plausible. Since we have no objective
reason to exclude them, the outliers were retained for all subsequent
analyses.
#STEP 4: Data exploration
We first visualized the distribution of log-transformed and
standardized COL11A2 across the different Covid-19 severity levels. This
showed that COL11A2 will be downregulated as Covid-19 becomes more
severe
ggplot(data_multivariate, aes(x = severity, y = COL11A2, fill= severity)) +
geom_boxplot(outliers = FALSE) +
geom_jitter (width =0.15, alpha =0.4, color = "black") +
scale_fill_brewer(palette = "Set2") +
theme_minimal()+
labs(title = "COL11A2 levels across the different severity groups", x = "severity groups", y = "Standardized log(COL11A2) expression")

We also looked at the distribution of COL11A2 in male and female
patients. We noticed that there was no big difference between the two
groups.
ggplot(data_multivariate, aes(x = sex, y = COL11A2, fill= sex)) +
geom_boxplot(outliers = FALSE) +
geom_jitter (width =0.15, alpha =0.4, color = "black") +
scale_fill_brewer(palette = "Set2") +
theme_minimal()+
labs (title = "Sex-Based Differences in COL11A2 Expression ")

Interpretation: Only within the severe and critical groups do we
observe a more pronounced difference between male and female patients.
This may be explained by the limited sample size in these categories, as
well as potential imbalance in sex distribution. Based on this boxplot,
we could hypothesize that COL11A2 protein expression is progressively
downregulated with increasing COVID-19 severity.
#STEP 5: Check assumptions
Normalization of protein COL11A2
ggqqplot(proteins_scaled$COL11A2) +
ylim(0,5)+
xlim(0,3)+
labs(title = "Normalization of COL11A2", x= NULL, y=NULL)

The QQ-plot shows that COL11A2 values follow the theoretical normal
distribution reasonably well, with only mild deviations in the upper
tail.
Normalization of COL11A2 within severity groups
data_multivariate %>%
ggplot(aes(sample = COL11A2)) +
geom_qq() +
geom_qq_line() +
facet_wrap(~severity) +
labs( title= "Normalization of COL11A2 within severity groups" )

We assessed the normality of COL11A2 within each severity group using
QQ-plots. Across groups, the distributions follow the theoretical normal
line reasonably well, with mild deviations, especially in the severe and
critical categories, largely attributable to small sample sizes and a
few extreme observations. These deviations are not substantial enough to
violate the normality assumption for the subsequent ANOVA.
Normalization of COL11A2 within sex groups
data_multivariate %>%
ggplot(aes(sample = COL11A2)) +
geom_qq() +
geom_qq_line() +
facet_wrap(~sex)+
labs( title= "Normalization of COL11A2 within sex groups" )

INTERPRETATION: The distribution deviates slightly from perfect
normality due to the presence of a few outliers, but overall the
residual pattern remains sufficiently close to normal for the
assumptions of the model to hold.
Check assumptions based on a simple linear regression
model
lm_COL11A2 <- lm(COL11A2 ~ sex + severity + sex*severity, data= data_multivariate)
plot(lm_COL11A2)




INTERPRETATION:
Linearity The residuals-versus-fitted plot indicates that the
linearity assumption is met. The smoothing line shows almost no
curvature, and the residuals are randomly scattered around zero,
suggesting no systematic under- or overprediction. The spread of
residuals does not show a funnel shape, and although a few outliers are
present, they do not distort the overall pattern.
Normality of residuals The QQ-plot shows that most residuals lie
close to the theoretical normal line, with only minor tail deviations.
This indicates that the normality assumption is reasonably
satisfied.
Homoscedasticity (equal variance) The residual spread appears
roughly constant across fitted values. The red smoothing line remains
nearly flat and no funneling or curvature is observed, suggesting that
the equal-variance assumption is met.
Outliers A small number of outliers are visible, but they appear
to be isolated observations rather than signs of structural problems in
the data. Because no evidence of measurement error was found, they are
retained in the analysis.
STEP 6: The two-sample Anova test
Because our data is approximately normally distributed, we selected a
two-way ANOVA to test our multivariate hypothesis.
anova_model <- aov( COL11A2 ~ severity + sex + severity * sex , data = data_multivariate)
summary(anova_model)
Df Sum Sq Mean Sq F value Pr(>F)
severity 4 89.52 22.380 34.804 <2e-16 ***
sex 1 0.70 0.705 1.096 0.296
severity:sex 4 1.23 0.309 0.480 0.751
Residuals 231 148.54 0.643
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
library(effectsize)
eta_squared(anova_model)
# Effect Size for ANOVA (Type I)
Parameter | Eta2 (partial) | 95% CI
--------------------------------------------
severity | 0.38 | [0.29, 1.00]
sex | 4.72e-03 | [0.00, 1.00]
severity:sex | 8.24e-03 | [0.00, 1.00]
- One-sided CIs: upper bound fixed at [1.00].
INTERPRETATION: At the 5% significance level, the two-way ANOVA shows
a statistically significant effect of COVID-19 severity on standardized
log-transformed COL11A2 expression (F(4, 231) = 34.8, p < 0.001). In
contrast, neither sex (F(1, 231) = 1.10, p = 0.296) nor the interaction
between sex and severity (F(4, 231) = 0.48, p = 0.751) is significant.
We therefore reject the null hypothesis for severity, but do not reject
the null hypotheses for sex and for the sex-severity interaction.
effect size: COVID-19 severity shows a large effect on COL11A2
expression (partial η² = 0.38), indicating that approximately 38% of the
variance is explained by severity. In contrast, sex and the sex×severity
interaction have negligible effect sizes (partial η² < 0.01).
The anova model was repeated for the interaction between COL11A2 and
severity to use for the post hoc analysis
sign_anova <- aov( COL11A2 ~ severity , data = data_multivariate)
summary(sign_anova)
Df Sum Sq Mean Sq F value Pr(>F)
severity 4 89.52 22.380 35.1 <2e-16 ***
Residuals 236 150.48 0.638
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
#STEP 7: Post hoc analyse
We know that Covid-19 severity has a significant effect on the
expression of COL11A2. It is important that we do a Post-hoc test to
find out for which groups the expression is significantily
different.
#install.packages("multcomp")
library(multcomp)
mcp <- glht(sign_anova,linfct = mcp (severity = 'Tukey' ))
summary(mcp)
Simultaneous Tests for General Linear Hypotheses
Multiple Comparisons of Means: Tukey Contrasts
Fit: aov(formula = COL11A2 ~ severity, data = data_multivariate)
Linear Hypotheses:
Estimate Std. Error t value Pr(>|t|)
mild - NEGATIVE == 0 -0.5923 0.1354 -4.373 0.000168 ***
moderate - NEGATIVE == 0 -1.1851 0.1583 -7.489 < 1e-04 ***
severe - NEGATIVE == 0 -1.7688 0.1937 -9.130 < 1e-04 ***
critical - NEGATIVE == 0 -2.0581 0.2471 -8.328 < 1e-04 ***
moderate - mild == 0 -0.5928 0.1390 -4.264 0.000249 ***
severe - mild == 0 -1.1764 0.1784 -6.595 < 1e-04 ***
critical - mild == 0 -1.4658 0.2353 -6.230 < 1e-04 ***
severe - moderate == 0 -0.5836 0.1963 -2.974 0.024695 *
critical - moderate == 0 -0.8730 0.2491 -3.504 0.004543 **
critical - severe == 0 -0.2893 0.2730 -1.060 0.817948
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
(Adjusted p values reported -- single-step method)
confint(mcp)$p
NULL
INTERPRETATION: The Tukey post-hoc test shows that mean standardized
log-COL11A2 expression is significantly lower in all COVID-19 severity
groups (mild, moderate, severe, critical) compared with the NEGATIVE
group (all adjusted p < 0.001). For example, the critical group has
on average 2.06 standard units lower COL11A2 expression than the
NEGATIVE group (estimate = −2.06, 95% CI [−2.73, −1.39]). In addition,
each successive increase in severity from mild to moderate, severe and
critical is associated with a significant further decrease in COL11A2
expression (all adjusted p < 0.05), except for the contrast between
severe and critical, where the 95% confidence interval includes zero
(estimate = −0.29, 95% CI [−1.03, 0.45], p = 0.82). At a global 5%
significance level we therefore conclude that COL11A2 expression
decreases progressively with increasing COVID-19 severity.
Visualisation
This boxplots supports the results obtained via the two-way ANOVA
test
library(ggplot2)
ggplot(data_multivariate, aes(x = severity, y = COL11A2, fill = sex)) +
geom_boxplot(outliers = FALSE) +
geom_jitter (width =0.15, alpha =0.4, color = "black") +
scale_fill_brewer(palette = "Set2") +
theme_minimal() +
labs(title = "The effect of sex and Covid-19 severity on COL11A2 expression", x = "severity groups", y = "Standardized log(COL11A2) expression")

FINAL CONCLUSION:
H0a (severity): We reject the null hypothesis (p < 0.001).
COVID-19 severity has a significant effect on standardized log-COL11A2
expression. Both the ANOVA and Tukey post-hoc tests show a progressive
decrease in COL11A2 levels from NEGATIVE → mild → moderate → severe →
critical, with all pairwise differences significant except
severe–critical. The boxplot visually confirms this downward trend,
indicating that COL11A2 is strongly downregulated as disease severity
increases.
H0b (sex): We do not reject the null hypothesis (p = 0.30). There is
no statistically significant difference in mean COL11A2 expression
between male and female patients. The figure shows substantial overlap
between sexes in each severity category, supporting this result.
H0c (interaction): We do not reject the null hypothesis (p = 0.75).
The effect of COVID-19 severity on COL11A2 expression does not differ
between males and females. The boxplot shows small apparent sex
differences only in the severe and critical groups, but these patterns
are likely due to limited and imbalanced sample sizes rather than a true
interaction.
Overall conclusion: Overall, COL11A2 expression decreases
consistently with increasing COVID-19 severity, indicating a strong and
significant severity effect visible in both the statistical tests and
the final figure. Sex and the sex×severity interaction are not
significant, and the minor visual differences in the most severe groups
likely reflect small sample sizes rather than true biological effects.
Thus, the severity-related decline in COL11A2 appears robust and
independent of patient sex.
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OgogIGh0bWxfZG9jdW1lbnQ6CiAgICBkZl9wcmludDogcGFnZWQKICBodG1sX25vdGVib29rOiBkZWZhdWx0CiAgd29yZF9kb2N1bWVudDogZGVmYXVsdAogIHBkZl9kb2N1bWVudDogZGVmYXVsdAotLS0KCiNTVEVQIDE6IENob29zZSB0aGUgdmFyaWFibGVzCgpXZSBhaW0gdG8gaW52ZXN0aWdhdGUgd2hldGhlciBDT1ZJRC0xOSBzZXZlcml0eSBpbmZsdWVuY2VzIENPTDExQTIgZXhwcmVzc2lvbiwgd2hldGhlciBwYXRpZW50IHNleCBhZmZlY3RzIENPTDExQTIgZXhwcmVzc2lvbiBhbmQgd2hldGhlciB0aGVyZSBpcyBhbiBpbnRlcmFjdGlvbiBiZXR3ZWVuIHNleCBhbmQgZGlzZWFzZSBzZXZlcml0eSBpbiBkZXRlcm1pbmluZyBDT0wxMUEyIGxldmVscy4gV2UgaW52ZXN0aWdhdGUgdGhyZWUgcXVlc3Rpb25zIChIMCA9IG51bGwgaHlwb3RoZXNpcyBhbmQgSDE9IGFsdGVybmF0aXZlIGh5cG90aGVzaXMpOgoKSDBhOiBUaGUgbWVhbiBzdGFuZGFyZGl6ZWQgQ09MMTFBMiBleHByZXNzaW9uIGlzIGVxdWFsIGFjcm9zcyBhbGwgQ09WSUQtMTkgc2V2ZXJpdHkgZ3JvdXBzLgpIMWE6IEF0IGxlYXN0IG9uZSBDT1ZJRC0xOSBzZXZlcml0eSBncm91cCBoYXMgYSBkaWZmZXJlbnQgbWVhbiBzdGFuZGFyZGl6ZWQgQ09MMTFBMiBleHByZXNzaW9uLgoKSDBiOiBUaGUgbWVhbiBzdGFuZGFyZGl6ZWQgQ09MMTFBMiBleHByZXNzaW9uIGlzIGVxdWFsIGJldHdlZW4gbWFsZSBhbmQgZmVtYWxlIHBhdGllbnRzLgpIMWI6IFRoZSBtZWFuIHN0YW5kYXJkaXplZCBDT0wxMUEyIGV4cHJlc3Npb24gZGlmZmVycyBiZXR3ZWVuIG1hbGUgYW5kIGZlbWFsZSBwYXRpZW50cy4KCkgwYzogVGhlcmUgaXMgbm8gaW50ZXJhY3Rpb24gYmV0d2VlbiBzZXggYW5kIENPVklELTE5IHNldmVyaXR5IG9uIG1lYW4gc3RhbmRhcmRpemVkIENPTDExQTIgZXhwcmVzc2lvbi4KSDFjOiBUaGUgZWZmZWN0IG9mIENPVklELTE5IHNldmVyaXR5IG9uIG1lYW4gc3RhbmRhcmRpemVkIENPTDExQTIgZXhwcmVzc2lvbiBkaWZmZXJzIGJldHdlZW4gbWFsZXMgYW5kIGZlbWFsZXMuICAKCldoeSBDT0wxMUEyPwpUaGlzIHByb3RlaW4gd2FzIHNlbGVjdGVkIGJlY2F1c2UgaXQgd2FzIG1lbnRpb25lZCBpbiB0aGUgcmVmZXJlbmNlIGFydGljbGUuIENPTDExQTIgaXMgYSBjb2xsYWdlbiBjb21wb25lbnQgaW52b2x2ZWQgaW4gdHdvIHBhdGh3YXlzIHRoYXQgd2VyZSBmb3VuZCB0byBiZSBkb3ducmVndWxhdGVkIGluIHNldmVyZSBDT1ZJRC0xOTogSW50ZWdyaW4gY2VsbCBzdXJmYWNlIGludGVyYWN0aW9ucyBhbmQgQ29sbGFnZW4gYmlvc3ludGhlc2lzIGFuZCBtb2RpZnlpbmcgZW56eW1lcy4gU2luY2UgdGhlc2UgcGF0aHdheXMgaW5jbHVkZSBtdWx0aXBsZSBjb2xsYWdlbiBwcm90ZWlucywgQ09MMTFBMiBpcyBhIGJpb2xvZ2ljYWxseSBtZWFuaW5nZnVsIGNhbmRpZGF0ZSBmb3IgaW52ZXN0aWdhdGluZyBzZXZlcml0eS1hc3NvY2lhdGVkIGRpZmZlcmVuY2VzLgoKCmBgYHtyfQojaW5zdGFsbC5wYWNrYWdlcygiZ2dwdWJyIikKCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShkcGx5cikKbGlicmFyeShnZ3B1YnIpCmxpYnJhcnkodGlkeXZlcnNlKQoKYGBgCgojU1RFUCAyOiBNYWtlIHRoZSBkYXRhc2V0ClRvIHRlc3Qgb3VyIGh5cG90aGVzZXMsIHdlIG5lZWQgYSBkYXRhc2V0IHRoYXQgY29udGFpbnMgYm90aCB0aGUgY2xpbmljYWwgdmFyaWFibGVzIChzZXggYW5kIFdIT190ZW1wX3NldmVyaXR5KSBhbmQgdGhlIHN0YW5kYXJkaXplZCwgbG9nLXRyYW5zZm9ybWVkIGV4cHJlc3Npb24gdmFsdWVzIG9mIHRoZSBwcm90ZWluIG9mIGludGVyZXN0IChDT0wxMUEyKS4gVGhlc2UgdmFyaWFibGVzIG9yaWdpbmF0ZSBmcm9tIGRpZmZlcmVudCBzZWN0aW9ucyBvZiB0aGUgZnVsbCBkYXRhc2V0LCBzbyBhIG5ldyBkYXRhZnJhbWUgbXVzdCBiZSBjb25zdHJ1Y3RlZC4KCkR1cmluZyB0aGUgZWFybGllciBkYXRhLWV4cGxvcmF0aW9uIHBoYXNlLCB3ZSB2ZXJpZmllZCB0aGF0IHRoZXJlIHdlcmUgbm8gbWlzc2luZyB2YWx1ZXMgaW4gc2V4LCBXSE9fdGVtcF9zZXZlcml0eSBvciB0aGUgQ09MMTFBMiBwcm90ZWluIG1lYXN1cmVtZW50cy4gVGhlcmVmb3JlLCBubyBhZGRpdGlvbmFsIGltcHV0YXRpb24gb3Igcm93IHJlbW92YWwgaXMgcmVxdWlyZWQgaW4gdGhpcyBwcmVwcm9jZXNzaW5nIHN0ZXAuCgpXZSBwcm9jZWVkIGJ5IGltcG9ydGluZyB0aGUgZnVsbCBkYXRhc2V0LCBleHRyYWN0aW5nIHRoZSBwcm90ZWluIGV4cHJlc3Npb24gbWF0cml4LCBhcHBseWluZyBhIGxvZy10cmFuc2Zvcm1hdGlvbiBmb2xsb3dlZCBieSBzdGFuZGFyZGl6YXRpb24gKHotc2NhbGluZyksIGFuZCBjb21iaW5pbmcgaXQgd2l0aCB0aGUgcmVsZXZhbnQgY2xpbmljYWwgZmVhdHVyZXMgaW50byBhIHNpbmdsZSBhbmFseXNpcy1yZWFkeSBkYXRhZnJhbWUuCmBgYHtyfQojIEltcG9ydCB3aG9sZSBkYXRhc2V0CmNvbWJpbmVkX2RhdGFzZXQgPC0gcmVhZC5jc3YoImNvbWJpbmVkX2RhdGFzZXQuY3N2IikKCiMgU3BsaXQgZGF0YXNldCBpbiBzdWJzZXRzCmNvbWJpbmVkX2RhdGFzZXRfcHJvdGVpbiA8LWNvbWJpbmVkX2RhdGFzZXRbLDE6NzI0MV0KcHJvdGVpbnNfbG9nIDwtIGxvZyhjb21iaW5lZF9kYXRhc2V0X3Byb3RlaW5bLDI6NzI0MV0pCnByb3RlaW5zX3NjYWxlZCA8LSBhcy5kYXRhLmZyYW1lKHNjYWxlKHByb3RlaW5zX2xvZykpCgpmZWF0dXJlX2RmIDwtY29tYmluZWRfZGF0YXNldFssNzI0Mjo3MjU4XQoKZGF0YV9tdWx0aXZhcmlhdGUgPC0gZGF0YS5mcmFtZSggQ09MMTFBMiA9IHByb3RlaW5zX3NjYWxlZCRDT0wxMUEyLCBzZXZlcml0eSA9IGZlYXR1cmVfZGYkV0hPX3RlbXBfc2V2ZXJpdHksIHNleCA9IGZlYXR1cmVfZGYkc2V4KQpkYXRhX211bHRpdmFyaWF0ZSRzZXZlcml0eSA8LSBmYWN0b3IoZGF0YV9tdWx0aXZhcmlhdGUkc2V2ZXJpdHksIGxldmVscyA9IGMoIk5FR0FUSVZFIiwgIm1pbGQiLCAibW9kZXJhdGUiLCAic2V2ZXJlIiwgImNyaXRpY2FsIikpCmBgYAoKCiNTVEVQIDM6IENoZWNrIGZvciBvdXRsaWVycwpUbyBpZGVudGlmeSBwb3RlbnRpYWwgZXh0cmVtZSB2YWx1ZXMsIHdlIHdpbGwgY2FsY3VsYXRlIHRoZSBpbnRlcnF1YXJ0aWxlIHJhbmdlIChJUVIpIG9mIENPTDExQTIgYW5kIGRldGVybWluZSB3aGljaCBvYnNlcnZhdGlvbnMgZmFsbCBvdXRzaWRlIHRoZSAxLjXDl0lRUiBib3VuZGFyaWVzLCBhcyB0aGVzZSB3aWxsIGJlIGNvbnNpZGVyZWQgc3RhdGlzdGljYWwgb3V0bGllcnMuCmBgYHtyfQpwcm90ZWluIDwtIGNvbWJpbmVkX2RhdGFzZXQkQ09MMTFBMgoKUTEgPC0gcXVhbnRpbGUocHJvdGVpbiwgMC4yNSwgbmEucm0gPSBUUlVFKQpRMyA8LSBxdWFudGlsZShwcm90ZWluLCAwLjc1LCBuYS5ybSA9IFRSVUUpCklRUl92YWx1ZSA8LSBJUVIocHJvdGVpbiwgbmEucm0gPSBUUlVFKQoKbG93ZXJfYm91bmQgPC0gUTEgLSAxLjUgKiBJUVJfdmFsdWUKdXBwZXJfYm91bmQgPC0gUTMgKyAxLjUgKiBJUVJfdmFsdWUKCm91dGxpZXJzIDwtIHByb3RlaW5bcHJvdGVpbiA8IGxvd2VyX2JvdW5kIHwgcHJvdGVpbiA+IHVwcGVyX2JvdW5kXQoKb3V0bGllcnMKYGBgCmBgYHtyfQoKYm94cGxvdChwcm90ZWluLCBtYWluPSJCb3hwbG90IENPTDExQTIiLCB5bGFiPSJFeHByZXNzaW9uIikKCmBgYApJTlRFUlBSRVRBVElPTjoKQWx0aG91Z2ggc2V2ZXJhbCBvdXRsaWVycyBhcmUgcHJlc2VudCAoYXMgc2VlbiBpbiBib3hwbG90KSwgdGhlcmUgaXMgbm8gZXZpZGVuY2Ugb2YgbWVhc3VyZW1lbnQgb3IgZGF0YS1lbnRyeSBlcnJvciBhbmQgdGhlIHZhbHVlcyBhcHBlYXIgYmlvbG9naWNhbGx5IHBsYXVzaWJsZS4gU2luY2Ugd2UgaGF2ZSBubyBvYmplY3RpdmUgcmVhc29uIHRvIGV4Y2x1ZGUgdGhlbSwgdGhlIG91dGxpZXJzIHdlcmUgcmV0YWluZWQgZm9yIGFsbCBzdWJzZXF1ZW50IGFuYWx5c2VzLgoKCiNTVEVQIDQ6IERhdGEgZXhwbG9yYXRpb24KCldlIGZpcnN0IHZpc3VhbGl6ZWQgdGhlIGRpc3RyaWJ1dGlvbiBvZiBsb2ctdHJhbnNmb3JtZWQgYW5kIHN0YW5kYXJkaXplZCBDT0wxMUEyIGFjcm9zcyB0aGUgZGlmZmVyZW50IENvdmlkLTE5IHNldmVyaXR5IGxldmVscy4gVGhpcyBzaG93ZWQgdGhhdCBDT0wxMUEyIHdpbGwgYmUgZG93bnJlZ3VsYXRlZCBhcyBDb3ZpZC0xOSBiZWNvbWVzIG1vcmUgc2V2ZXJlCgpgYGB7cn0KZ2dwbG90KGRhdGFfbXVsdGl2YXJpYXRlLCBhZXMoeCA9IHNldmVyaXR5LCB5ID0gQ09MMTFBMiwgZmlsbD0gc2V2ZXJpdHkpKSArCiAgZ2VvbV9ib3hwbG90KG91dGxpZXJzID0gRkFMU0UpICsKICBnZW9tX2ppdHRlciAod2lkdGggPTAuMTUsIGFscGhhID0wLjQsIGNvbG9yID0gImJsYWNrIikgKwogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiU2V0MiIpICsKICB0aGVtZV9taW5pbWFsKCkrCiAgbGFicyh0aXRsZSA9ICJDT0wxMUEyIGxldmVscyBhY3Jvc3MgdGhlIGRpZmZlcmVudCBzZXZlcml0eSBncm91cHMiLCB4ID0gInNldmVyaXR5IGdyb3VwcyIsIHkgPSAiU3RhbmRhcmRpemVkIGxvZyhDT0wxMUEyKSBleHByZXNzaW9uIikKYGBgCldlIGFsc28gbG9va2VkIGF0IHRoZSBkaXN0cmlidXRpb24gb2YgQ09MMTFBMiBpbiBtYWxlIGFuZCBmZW1hbGUgcGF0aWVudHMuIFdlIG5vdGljZWQgdGhhdCB0aGVyZSB3YXMgbm8gYmlnIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgdHdvIGdyb3Vwcy4KCmBgYHtyfQpnZ3Bsb3QoZGF0YV9tdWx0aXZhcmlhdGUsIGFlcyh4ID0gc2V4LCB5ID0gQ09MMTFBMiwgZmlsbD0gc2V4KSkgKwogIGdlb21fYm94cGxvdChvdXRsaWVycyA9IEZBTFNFKSArCiAgZ2VvbV9qaXR0ZXIgKHdpZHRoID0wLjE1LCBhbHBoYSA9MC40LCBjb2xvciA9ICJibGFjayIpICsKICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlNldDIiKSArCiAgdGhlbWVfbWluaW1hbCgpKwogIGxhYnMgKHRpdGxlID0gIlNleC1CYXNlZCBEaWZmZXJlbmNlcyBpbiBDT0wxMUEyIEV4cHJlc3Npb24gIikKCmBgYAoKSW50ZXJwcmV0YXRpb246Ck9ubHkgd2l0aGluIHRoZSBzZXZlcmUgYW5kIGNyaXRpY2FsIGdyb3VwcyBkbyB3ZSBvYnNlcnZlIGEgbW9yZSBwcm9ub3VuY2VkIGRpZmZlcmVuY2UgYmV0d2VlbiBtYWxlIGFuZCBmZW1hbGUgcGF0aWVudHMuIFRoaXMgbWF5IGJlIGV4cGxhaW5lZCBieSB0aGUgbGltaXRlZCBzYW1wbGUgc2l6ZSBpbiB0aGVzZSBjYXRlZ29yaWVzLCBhcyB3ZWxsIGFzIHBvdGVudGlhbCBpbWJhbGFuY2UgaW4gc2V4IGRpc3RyaWJ1dGlvbi4gQmFzZWQgb24gdGhpcyBib3hwbG90LCB3ZSBjb3VsZCBoeXBvdGhlc2l6ZSB0aGF0IENPTDExQTIgcHJvdGVpbiBleHByZXNzaW9uIGlzIHByb2dyZXNzaXZlbHkgZG93bnJlZ3VsYXRlZCB3aXRoIGluY3JlYXNpbmcgQ09WSUQtMTkgc2V2ZXJpdHkuCgoKCiNTVEVQIDU6IENoZWNrIGFzc3VtcHRpb25zCgoqKk5vcm1hbGl6YXRpb24gb2YgcHJvdGVpbiBDT0wxMUEyKioKYGBge3J9CmdncXFwbG90KHByb3RlaW5zX3NjYWxlZCRDT0wxMUEyKSArCiAgeWxpbSgwLDUpKwogIHhsaW0oMCwzKSsgCiAgbGFicyh0aXRsZSA9ICJOb3JtYWxpemF0aW9uIG9mIENPTDExQTIiLCB4PSBOVUxMLCB5PU5VTEwpCmBgYApUaGUgUVEtcGxvdCBzaG93cyB0aGF0IENPTDExQTIgdmFsdWVzIGZvbGxvdyB0aGUgdGhlb3JldGljYWwgbm9ybWFsIGRpc3RyaWJ1dGlvbiByZWFzb25hYmx5IHdlbGwsIHdpdGggb25seSBtaWxkIGRldmlhdGlvbnMgaW4gdGhlIHVwcGVyIHRhaWwuCgoKKipOb3JtYWxpemF0aW9uIG9mIENPTDExQTIgd2l0aGluIHNldmVyaXR5IGdyb3VwcyoqCmBgYHtyfQpkYXRhX211bHRpdmFyaWF0ZSAlPiUKICBnZ3Bsb3QoYWVzKHNhbXBsZSA9IENPTDExQTIpKSArCiAgZ2VvbV9xcSgpICsgCiAgZ2VvbV9xcV9saW5lKCkgKwogIGZhY2V0X3dyYXAofnNldmVyaXR5KSArCiAgbGFicyggdGl0bGU9ICJOb3JtYWxpemF0aW9uIG9mIENPTDExQTIgd2l0aGluIHNldmVyaXR5IGdyb3VwcyIgKQpgYGAKV2UgYXNzZXNzZWQgdGhlIG5vcm1hbGl0eSBvZiBDT0wxMUEyIHdpdGhpbiBlYWNoIHNldmVyaXR5IGdyb3VwIHVzaW5nIFFRLXBsb3RzLiBBY3Jvc3MgZ3JvdXBzLCB0aGUgZGlzdHJpYnV0aW9ucyBmb2xsb3cgdGhlIHRoZW9yZXRpY2FsIG5vcm1hbCBsaW5lIHJlYXNvbmFibHkgd2VsbCwgd2l0aCBtaWxkIGRldmlhdGlvbnMsIGVzcGVjaWFsbHkgaW4gdGhlIHNldmVyZSBhbmQgY3JpdGljYWwgY2F0ZWdvcmllcywgbGFyZ2VseSBhdHRyaWJ1dGFibGUgdG8gc21hbGwgc2FtcGxlIHNpemVzIGFuZCBhIGZldyBleHRyZW1lIG9ic2VydmF0aW9ucy4gVGhlc2UgZGV2aWF0aW9ucyBhcmUgbm90IHN1YnN0YW50aWFsIGVub3VnaCB0byB2aW9sYXRlIHRoZSBub3JtYWxpdHkgYXNzdW1wdGlvbiBmb3IgdGhlIHN1YnNlcXVlbnQgQU5PVkEuCgoqKk5vcm1hbGl6YXRpb24gb2YgQ09MMTFBMiB3aXRoaW4gc2V4IGdyb3VwcyoqCmBgYHtyfQpkYXRhX211bHRpdmFyaWF0ZSAlPiUKICBnZ3Bsb3QoYWVzKHNhbXBsZSA9IENPTDExQTIpKSArCiAgZ2VvbV9xcSgpICsgCiAgZ2VvbV9xcV9saW5lKCkgKwogIGZhY2V0X3dyYXAofnNleCkrCiAgbGFicyggdGl0bGU9ICJOb3JtYWxpemF0aW9uIG9mIENPTDExQTIgd2l0aGluIHNleCBncm91cHMiICkKYGBgCklOVEVSUFJFVEFUSU9OOgpUaGUgZGlzdHJpYnV0aW9uIGRldmlhdGVzIHNsaWdodGx5IGZyb20gcGVyZmVjdCBub3JtYWxpdHkgZHVlIHRvIHRoZSBwcmVzZW5jZSBvZiBhIGZldyBvdXRsaWVycywgYnV0IG92ZXJhbGwgdGhlIHJlc2lkdWFsIHBhdHRlcm4gcmVtYWlucyBzdWZmaWNpZW50bHkgY2xvc2UgdG8gbm9ybWFsIGZvciB0aGUgYXNzdW1wdGlvbnMgb2YgdGhlIG1vZGVsIHRvIGhvbGQuCgoKKipDaGVjayBhc3N1bXB0aW9ucyBiYXNlZCBvbiBhIHNpbXBsZSBsaW5lYXIgcmVncmVzc2lvbiBtb2RlbCoqCmBgYHtyfQpsbV9DT0wxMUEyIDwtIGxtKENPTDExQTIgfiBzZXggKyBzZXZlcml0eSArIHNleCpzZXZlcml0eSwgZGF0YT0gZGF0YV9tdWx0aXZhcmlhdGUpCnBsb3QobG1fQ09MMTFBMikKYGBgCklOVEVSUFJFVEFUSU9OOgoKLSBMaW5lYXJpdHkKVGhlIHJlc2lkdWFscy12ZXJzdXMtZml0dGVkIHBsb3QgaW5kaWNhdGVzIHRoYXQgdGhlIGxpbmVhcml0eSBhc3N1bXB0aW9uIGlzIG1ldC4gVGhlIHNtb290aGluZyBsaW5lIHNob3dzIGFsbW9zdCBubyBjdXJ2YXR1cmUsIGFuZCB0aGUgcmVzaWR1YWxzIGFyZSByYW5kb21seSBzY2F0dGVyZWQgYXJvdW5kIHplcm8sIHN1Z2dlc3Rpbmcgbm8gc3lzdGVtYXRpYyB1bmRlci0gb3Igb3ZlcnByZWRpY3Rpb24uIFRoZSBzcHJlYWQgb2YgcmVzaWR1YWxzIGRvZXMgbm90IHNob3cgYSBmdW5uZWwgc2hhcGUsIGFuZCBhbHRob3VnaCBhIGZldyBvdXRsaWVycyBhcmUgcHJlc2VudCwgdGhleSBkbyBub3QgZGlzdG9ydCB0aGUgb3ZlcmFsbCBwYXR0ZXJuLgoKLSBOb3JtYWxpdHkgb2YgcmVzaWR1YWxzClRoZSBRUS1wbG90IHNob3dzIHRoYXQgbW9zdCByZXNpZHVhbHMgbGllIGNsb3NlIHRvIHRoZSB0aGVvcmV0aWNhbCBub3JtYWwgbGluZSwgd2l0aCBvbmx5IG1pbm9yIHRhaWwgZGV2aWF0aW9ucy4gVGhpcyBpbmRpY2F0ZXMgdGhhdCB0aGUgbm9ybWFsaXR5IGFzc3VtcHRpb24gaXMgcmVhc29uYWJseSBzYXRpc2ZpZWQuCgotIEhvbW9zY2VkYXN0aWNpdHkgKGVxdWFsIHZhcmlhbmNlKQpUaGUgcmVzaWR1YWwgc3ByZWFkIGFwcGVhcnMgcm91Z2hseSBjb25zdGFudCBhY3Jvc3MgZml0dGVkIHZhbHVlcy4gVGhlIHJlZCBzbW9vdGhpbmcgbGluZSByZW1haW5zIG5lYXJseSBmbGF0IGFuZCBubyBmdW5uZWxpbmcgb3IgY3VydmF0dXJlIGlzIG9ic2VydmVkLCBzdWdnZXN0aW5nIHRoYXQgdGhlIGVxdWFsLXZhcmlhbmNlIGFzc3VtcHRpb24gaXMgbWV0LgoKLSBPdXRsaWVycwpBIHNtYWxsIG51bWJlciBvZiBvdXRsaWVycyBhcmUgdmlzaWJsZSwgYnV0IHRoZXkgYXBwZWFyIHRvIGJlIGlzb2xhdGVkIG9ic2VydmF0aW9ucyByYXRoZXIgdGhhbiBzaWducyBvZiBzdHJ1Y3R1cmFsIHByb2JsZW1zIGluIHRoZSBkYXRhLiBCZWNhdXNlIG5vIGV2aWRlbmNlIG9mIG1lYXN1cmVtZW50IGVycm9yIHdhcyBmb3VuZCwgdGhleSBhcmUgcmV0YWluZWQgaW4gdGhlIGFuYWx5c2lzLgoKCiMgU1RFUCA2OiBUaGUgdHdvLXNhbXBsZSBBbm92YSB0ZXN0CgpCZWNhdXNlIG91ciBkYXRhIGlzIGFwcHJveGltYXRlbHkgbm9ybWFsbHkgZGlzdHJpYnV0ZWQsIHdlIHNlbGVjdGVkIGEgdHdvLXdheSBBTk9WQSB0byB0ZXN0IG91ciBtdWx0aXZhcmlhdGUgaHlwb3RoZXNpcy4KCmBgYHtyfQphbm92YV9tb2RlbCA8LSBhb3YoIENPTDExQTIgfiBzZXZlcml0eSArIHNleCArIHNldmVyaXR5ICogc2V4ICwgZGF0YSA9IGRhdGFfbXVsdGl2YXJpYXRlKQpzdW1tYXJ5KGFub3ZhX21vZGVsKQpsaWJyYXJ5KGVmZmVjdHNpemUpCgpldGFfc3F1YXJlZChhbm92YV9tb2RlbCkKYGBgCklOVEVSUFJFVEFUSU9OOgpBdCB0aGUgNSUgc2lnbmlmaWNhbmNlIGxldmVsLCB0aGUgdHdvLXdheSBBTk9WQSBzaG93cyBhIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgZWZmZWN0IG9mIENPVklELTE5IHNldmVyaXR5IG9uIHN0YW5kYXJkaXplZCBsb2ctdHJhbnNmb3JtZWQgQ09MMTFBMiBleHByZXNzaW9uIChGKDQsIDIzMSkgPSAzNC44LCBwIDwgMC4wMDEpLiBJbiBjb250cmFzdCwgbmVpdGhlciBzZXggKEYoMSwgMjMxKSA9IDEuMTAsIHAgPSAwLjI5Nikgbm9yIHRoZSBpbnRlcmFjdGlvbiBiZXR3ZWVuIHNleCBhbmQgc2V2ZXJpdHkgKEYoNCwgMjMxKSA9IDAuNDgsIHAgPSAwLjc1MSkgaXMgc2lnbmlmaWNhbnQuIFdlIHRoZXJlZm9yZSByZWplY3QgdGhlIG51bGwgaHlwb3RoZXNpcyBmb3Igc2V2ZXJpdHksIGJ1dCBkbyBub3QgcmVqZWN0IHRoZSBudWxsIGh5cG90aGVzZXMgZm9yIHNleCBhbmQgZm9yIHRoZSBzZXgtc2V2ZXJpdHkgaW50ZXJhY3Rpb24uCgplZmZlY3Qgc2l6ZToKQ09WSUQtMTkgc2V2ZXJpdHkgc2hvd3MgYSBsYXJnZSBlZmZlY3Qgb24gQ09MMTFBMiBleHByZXNzaW9uIChwYXJ0aWFsIM63wrIgPSAwLjM4KSwgaW5kaWNhdGluZyB0aGF0IGFwcHJveGltYXRlbHkgMzglIG9mIHRoZSB2YXJpYW5jZSBpcyBleHBsYWluZWQgYnkgc2V2ZXJpdHkuIEluIGNvbnRyYXN0LCBzZXggYW5kIHRoZSBzZXjDl3NldmVyaXR5IGludGVyYWN0aW9uIGhhdmUgbmVnbGlnaWJsZSBlZmZlY3Qgc2l6ZXMgKHBhcnRpYWwgzrfCsiA8IDAuMDEpLgoKVGhlIGFub3ZhIG1vZGVsIHdhcyByZXBlYXRlZCBmb3IgdGhlIGludGVyYWN0aW9uIGJldHdlZW4gQ09MMTFBMiBhbmQgc2V2ZXJpdHkgdG8gdXNlIGZvciB0aGUgcG9zdCBob2MgYW5hbHlzaXMgCmBgYHtyfQpzaWduX2Fub3ZhIDwtIGFvdiggQ09MMTFBMiB+IHNldmVyaXR5ICwgZGF0YSA9IGRhdGFfbXVsdGl2YXJpYXRlKQpzdW1tYXJ5KHNpZ25fYW5vdmEpCmBgYAoKI1NURVAgNzogUG9zdCBob2MgYW5hbHlzZQoKV2Uga25vdyB0aGF0IENvdmlkLTE5IHNldmVyaXR5IGhhcyBhIHNpZ25pZmljYW50IGVmZmVjdCBvbiB0aGUgZXhwcmVzc2lvbiBvZiBDT0wxMUEyLiBJdCBpcyBpbXBvcnRhbnQgdGhhdCB3ZSBkbyBhIFBvc3QtaG9jIHRlc3QgdG8gZmluZCBvdXQgZm9yIHdoaWNoIGdyb3VwcyB0aGUgZXhwcmVzc2lvbiBpcyBzaWduaWZpY2FudGlseSBkaWZmZXJlbnQuCgoKYGBge3J9CiNpbnN0YWxsLnBhY2thZ2VzKCJtdWx0Y29tcCIpCmxpYnJhcnkobXVsdGNvbXApCgptY3AgPC0gZ2xodChzaWduX2Fub3ZhLGxpbmZjdCA9IG1jcCAoc2V2ZXJpdHkgPSAnVHVrZXknICkpCnN1bW1hcnkobWNwKQpgYGAKCmBgYHtyfQpjb25maW50KG1jcCkKCgpwYXIobWFyID0gYyg1LCAxMiwgNCwgMikpICMgYm90dG9tLCBsZWZ0LCB0b3AsIHJpZ2h0CnBsb3QobWNwKQpgYGAKSU5URVJQUkVUQVRJT046ClRoZSBUdWtleSBwb3N0LWhvYyB0ZXN0IHNob3dzIHRoYXQgbWVhbiBzdGFuZGFyZGl6ZWQgbG9nLUNPTDExQTIgZXhwcmVzc2lvbiBpcyBzaWduaWZpY2FudGx5IGxvd2VyIGluIGFsbCBDT1ZJRC0xOSBzZXZlcml0eSBncm91cHMgKG1pbGQsIG1vZGVyYXRlLCBzZXZlcmUsIGNyaXRpY2FsKSBjb21wYXJlZCB3aXRoIHRoZSBORUdBVElWRSBncm91cCAoYWxsIGFkanVzdGVkIHAgPCAwLjAwMSkuIEZvciBleGFtcGxlLCB0aGUgY3JpdGljYWwgZ3JvdXAgaGFzIG9uIGF2ZXJhZ2UgMi4wNiBzdGFuZGFyZCB1bml0cyBsb3dlciBDT0wxMUEyIGV4cHJlc3Npb24gdGhhbiB0aGUgTkVHQVRJVkUgZ3JvdXAgKGVzdGltYXRlID0g4oiSMi4wNiwgOTUlIENJIFviiJIyLjczLCDiiJIxLjM5XSkuIEluIGFkZGl0aW9uLCBlYWNoIHN1Y2Nlc3NpdmUgaW5jcmVhc2UgaW4gc2V2ZXJpdHkgZnJvbSBtaWxkIHRvIG1vZGVyYXRlLCBzZXZlcmUgYW5kIGNyaXRpY2FsIGlzIGFzc29jaWF0ZWQgd2l0aCBhIHNpZ25pZmljYW50IGZ1cnRoZXIgZGVjcmVhc2UgaW4gQ09MMTFBMiBleHByZXNzaW9uIChhbGwgYWRqdXN0ZWQgcCA8IDAuMDUpLCBleGNlcHQgZm9yIHRoZSBjb250cmFzdCBiZXR3ZWVuIHNldmVyZSBhbmQgY3JpdGljYWwsIHdoZXJlIHRoZSA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbCBpbmNsdWRlcyB6ZXJvIChlc3RpbWF0ZSA9IOKIkjAuMjksIDk1JSBDSSBb4oiSMS4wMywgMC40NV0sIHAgPSAwLjgyKS4gQXQgYSBnbG9iYWwgNSUgc2lnbmlmaWNhbmNlIGxldmVsIHdlIHRoZXJlZm9yZSBjb25jbHVkZSB0aGF0IENPTDExQTIgZXhwcmVzc2lvbiBkZWNyZWFzZXMgcHJvZ3Jlc3NpdmVseSB3aXRoIGluY3JlYXNpbmcgQ09WSUQtMTkgc2V2ZXJpdHkuCgoqKlZpc3VhbGlzYXRpb24qKgoKVGhpcyBib3hwbG90cyBzdXBwb3J0cyB0aGUgcmVzdWx0cyBvYnRhaW5lZCB2aWEgdGhlIHR3by13YXkgQU5PVkEgdGVzdApgYGB7cn0KbGlicmFyeShnZ3Bsb3QyKQoKCmdncGxvdChkYXRhX211bHRpdmFyaWF0ZSwgYWVzKHggPSBzZXZlcml0eSwgeSA9IENPTDExQTIsIGZpbGwgPSBzZXgpKSArCiAgZ2VvbV9ib3hwbG90KG91dGxpZXJzID0gRkFMU0UpICsKICBnZW9tX2ppdHRlciAod2lkdGggPTAuMTUsIGFscGhhID0wLjQsIGNvbG9yID0gImJsYWNrIikgKwogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiU2V0MiIpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIGxhYnModGl0bGUgPSAiVGhlIGVmZmVjdCBvZiBzZXggYW5kIENvdmlkLTE5IHNldmVyaXR5IG9uIENPTDExQTIgZXhwcmVzc2lvbiIsIHggPSAic2V2ZXJpdHkgZ3JvdXBzIiwgeSA9ICJTdGFuZGFyZGl6ZWQgbG9nKENPTDExQTIpIGV4cHJlc3Npb24iKQoKYGBgCkZJTkFMIENPTkNMVVNJT046CgpIMGEgKHNldmVyaXR5KTogV2UgcmVqZWN0IHRoZSBudWxsIGh5cG90aGVzaXMgKHAgPCAwLjAwMSkuIENPVklELTE5IHNldmVyaXR5IGhhcyBhIHNpZ25pZmljYW50IGVmZmVjdCBvbiBzdGFuZGFyZGl6ZWQgbG9nLUNPTDExQTIgZXhwcmVzc2lvbi4gQm90aCB0aGUgQU5PVkEgYW5kIFR1a2V5IHBvc3QtaG9jIHRlc3RzIHNob3cgYSBwcm9ncmVzc2l2ZSBkZWNyZWFzZSBpbiBDT0wxMUEyIGxldmVscyBmcm9tIE5FR0FUSVZFIOKGkiBtaWxkIOKGkiBtb2RlcmF0ZSDihpIgc2V2ZXJlIOKGkiBjcml0aWNhbCwgd2l0aCBhbGwgcGFpcndpc2UgZGlmZmVyZW5jZXMgc2lnbmlmaWNhbnQgZXhjZXB0IHNldmVyZeKAk2NyaXRpY2FsLiBUaGUgYm94cGxvdCB2aXN1YWxseSBjb25maXJtcyB0aGlzIGRvd253YXJkIHRyZW5kLCBpbmRpY2F0aW5nIHRoYXQgQ09MMTFBMiBpcyBzdHJvbmdseSBkb3ducmVndWxhdGVkIGFzIGRpc2Vhc2Ugc2V2ZXJpdHkgaW5jcmVhc2VzLgoKSDBiIChzZXgpOiBXZSBkbyBub3QgcmVqZWN0IHRoZSBudWxsIGh5cG90aGVzaXMgKHAgPSAwLjMwKS4gVGhlcmUgaXMgbm8gc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBkaWZmZXJlbmNlIGluIG1lYW4gQ09MMTFBMiBleHByZXNzaW9uIGJldHdlZW4gbWFsZSBhbmQgZmVtYWxlIHBhdGllbnRzLiBUaGUgZmlndXJlIHNob3dzIHN1YnN0YW50aWFsIG92ZXJsYXAgYmV0d2VlbiBzZXhlcyBpbiBlYWNoIHNldmVyaXR5IGNhdGVnb3J5LCBzdXBwb3J0aW5nIHRoaXMgcmVzdWx0LgoKSDBjIChpbnRlcmFjdGlvbik6IFdlIGRvIG5vdCByZWplY3QgdGhlIG51bGwgaHlwb3RoZXNpcyAocCA9IDAuNzUpLiBUaGUgZWZmZWN0IG9mIENPVklELTE5IHNldmVyaXR5IG9uIENPTDExQTIgZXhwcmVzc2lvbiBkb2VzIG5vdCBkaWZmZXIgYmV0d2VlbiBtYWxlcyBhbmQgZmVtYWxlcy4gVGhlIGJveHBsb3Qgc2hvd3Mgc21hbGwgYXBwYXJlbnQgc2V4IGRpZmZlcmVuY2VzIG9ubHkgaW4gdGhlIHNldmVyZSBhbmQgY3JpdGljYWwgZ3JvdXBzLCBidXQgdGhlc2UgcGF0dGVybnMgYXJlIGxpa2VseSBkdWUgdG8gbGltaXRlZCBhbmQgaW1iYWxhbmNlZCBzYW1wbGUgc2l6ZXMgcmF0aGVyIHRoYW4gYSB0cnVlIGludGVyYWN0aW9uLgoKT3ZlcmFsbCBjb25jbHVzaW9uOgpPdmVyYWxsLCBDT0wxMUEyIGV4cHJlc3Npb24gZGVjcmVhc2VzIGNvbnNpc3RlbnRseSB3aXRoIGluY3JlYXNpbmcgQ09WSUQtMTkgc2V2ZXJpdHksIGluZGljYXRpbmcgYSBzdHJvbmcgYW5kIHNpZ25pZmljYW50IHNldmVyaXR5IGVmZmVjdCB2aXNpYmxlIGluIGJvdGggdGhlIHN0YXRpc3RpY2FsIHRlc3RzIGFuZCB0aGUgZmluYWwgZmlndXJlLiBTZXggYW5kIHRoZSBzZXjDl3NldmVyaXR5IGludGVyYWN0aW9uIGFyZSBub3Qgc2lnbmlmaWNhbnQsIGFuZCB0aGUgbWlub3IgdmlzdWFsIGRpZmZlcmVuY2VzIGluIHRoZSBtb3N0IHNldmVyZSBncm91cHMgbGlrZWx5IHJlZmxlY3Qgc21hbGwgc2FtcGxlIHNpemVzIHJhdGhlciB0aGFuIHRydWUgYmlvbG9naWNhbCBlZmZlY3RzLiBUaHVzLCB0aGUgc2V2ZXJpdHktcmVsYXRlZCBkZWNsaW5lIGluIENPTDExQTIgYXBwZWFycyByb2J1c3QgYW5kIGluZGVwZW5kZW50IG9mIHBhdGllbnQgc2V4LgoK